package com.example.gulimall.order;

import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;


/*
    1.引入amqp会自动生成RabbitAutoConfiguration
    2.给容器中自动配置
        1. RabbitTemplate
        2. AmqpAdmin
        3. CachingConnectionFactory
        4. RabbitMessagingTemplate
        这些信息都在Spring.rabbit中配置
    3. 在配置文件中配置 spring.rabbitmq 信息
    4. EnableRabbit开启RabbitMQ
    5. 接受消息需要用@RabbitListener 这个需要开启EnableRabbit
    6. @RabbitListener：标在类和方法上 监听哪些队列
       @RabbitHandler:  标在方法上，重载区分不同类型的消息

    本地事务失效问题
    同一个对象内事物方法互调默认失效 原因：绕过了代理对象 事物使用代理对象来控制的
    解决方法：使用代理对象来调用事物方法
    1. 引入spring-boot-aop-starter
    2. @EnableAspectJAutoProxy(exposeProxy=true) 开启动态代理
    3. 使用代理对象来调用对象

    使用seata控制分布式事物
    1 每一个微服务需要undolog表
    2 需要下载事务协调器
    还是两次确认 高并发效果比较差 所以不怎么实用


    容错机制：
    1. 尝试重新发送
    2. 发送每条消息做好记录 (给数据库保存每个消息的详细信息) 定期扫描数据库 将发送失败的消息重新发送

    消息挤压：
    增加消费者
    上线的队列消费服务 先将消息批量取出来 记录数据库 离线再慢慢处理
 */

@EnableRabbit
@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
@EnableRedisHttpSession
public class GulimallOrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimallOrderApplication.class, args);
    }

}
